<?php
namespace Admin\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Admin\Form\AddProductForm;
use Admin\Form\EditForm;
use Zend\Session\Container;
use Zend\Mvc\MvcEvent;

class ManageController extends AbstractActionController
{
    public $session;
    public $view;
    protected $em;
    protected $authService;

    public function __construct (){
        $this->session = new Container();
        $this->view = new ViewModel();
        $this->view->controller = 'manage';
        $this->em = $this->getEventManager();
        $this->em->attach(MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'),100);
        echo '<script> var controllername="manage"; </script>';
    }

    public function getAuthService(){
        if(!$this->authService){
            $this->authService = $this->getServiceLocator()->get('AuthService');
        }
        return $this->authService;
    }

    public function preDispatch(){
        if(!$this->getAuthService()->hasIdentity())
            $this->_redirect()->toRoute(NULL,array('controller'=>'auth','action'=>'login'));
        $username = $this->getAuthService()->getStorage()->read();
        $this->layout('layout/admin');
        $this->layout()->username = $username;
    }

    public function indexAction(){
        $this->view->action = 'index';
       	// trang quản lý các mặt hàng đang có, có thể xóa sản phẩm ở đây
        
        $productTable = $this->getServiceLocator()->get('Admin\Model\AdminProductTable');
        $products = $productTable->fetchAll();
        $this->view->products = $products;
        $this->view->filePath = FILES_PATH;
        if($this->session->offsetExists('thongbao')){
            $this->view->thongbao = $this->session->offsetGet('thongbao');
            $this->session->offsetUnset('thongbao');
        }
        return $this->view;

    }

    // thêm sản phẩm vào csdl
    public function addAction(){
        $this->view->action = 'add';
        $form = new AddProductForm();
        $this->view->form = $form;
        return $this->view;
    }

    public function uploadAction(){

        $this->view->action = 'upload';
        // trang upload file
        $form = new AddProductForm();
        $request = $this->getRequest();
        if($request->isPost()){
            // lấy thông tin upload
            $params = $request->getPost()->toArray();
            $files = $request->getFiles()->toArray();

            $productTable = $this->getServiceLocator()->get('Admin\Model\AdminProductTable');
            
            // upload dữ liệu vào csdl trước sau đó upload file
            // tiến hành lấy tên các file được gửi đến
            $hinhAnh = '';
            foreach ($files as $file) {
                if($file['name']!='')
                    $hinhAnh.= $file['name'].'|';
            }

            $params['hinhAnh'] = $hinhAnh;
            $ketqua = $productTable->saveProduct($params, array('task'=>'add'));
            
            if($ketqua){
                // thêm dữ liệu vào csdl thành công.
                $dir = FILES_PATH.'/'.$params['loaiHang'].'/'.$params['maHang'];
                if (!file_exists($dir) && !is_dir($dir)){
                    if(!mkdir($dir))         
                        $this->checkingRequest(2);
                    else{
                        $result = $form->upload($files,$dir);
                        if($result[0]==1) $this->checkingRequest(1);
                        else $this->checkingRequest(3);
                    }
                }else{
                    $this->checkingRequest(3);
                }
            }else{
                // thêm dữ liệu vào csdl thất bại.
                $this->checkingRequest(0);
            }
        }else{
            // không có dữ liệu được gửi đến nên không thể upload
            echo "Không có dữ liệu được gửi đến";
        }

        return $this->view;
    }

    // xem thông tin chi tiết một sản phẩm
    public function viewDetailAction(){
        $this->view->action = 'viewdetail';
        $id = $this->params()->fromRoute('id');
        $productTable = $this->getServiceLocator()->get('Admin\Model\AdminProductTable');
        $this->view->data = $productTable->getProduct($id);
        return $this->view;
    }

    // cập nhật thông tin mới cho sản phẩm
    public function editAction(){
        $this->view->action = 'edit';
        $id = $this->params()->fromRoute('id');
        if(is_null($id)){
            $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
            return $this->view;
        }
    	// Trang thay đổi thông tin sản phẩm
        $form = new AddProductForm();
        $productTable = $this->getServiceLocator()->get('Admin\Model\AdminProductTable');
        $arrParams = $this->getRequest()->getPost()->toArray();
        if($arrParams != NULL){
            // đã gửi yêu cầu thay đổi

            $thongtincu = $this->session->offsetGet('thongtinsanpham');
            // so sánh thông tin cũ trong csdl với thông tin mới vừa nhập vào
            unset($arrParams['submit']);
            // update dữ liệu về hình ảnh
            $files = $this->getRequest()->getFiles()->toArray();
            $arrParams['hinhAnh'] = '';
            $oldImages = explode('|', $thongtincu['hinhAnh']);
            unset($oldImages[count($oldImages)-1]);
            // mảng chứa tên các file bị xóa.
            $exImages = array();
            $heSo = 0;
            foreach ($files as $file){
                if($file['name']!=NULL){
                    // lấy danh sách các file mới được upload và thay đổi nội dung trong csdl
                    // cần lấy tên các file bị xóa
                    $arrParams['hinhAnh'] .= $file['name'].'|';
                    if($heSo < count($oldImages)){
                        array_push($exImages, $oldImages[$heSo]);
                    }
                }else{
                    if($heSo < count($oldImages))    
                        $arrParams['hinhAnh'] .= $oldImages[$heSo].'|';
                }
                $heSo++;
            }
            // phần update dữ liệu dạng text, không liên quan đến hình ảnh
            // so sánh và kiểu tra dữ liệu mới được nhập vào
            if($this->compare($thongtincu, $arrParams)){
                // thành công, tiến hành update dữ liệu
                $options = array('task'=>'edit');
                $result = $productTable->editProduct($arrParams,$thongtincu,$options);  // 1 - thành công 0 - thất bại
               if($result){
                    // cập nhật dữ liệu thành công
                    // lưu ảnh mới và xóa ảnh cũ
                    if($thongtincu['hinhAnh'] != $arrParams['hinhAnh']){
                        // nếu có thay đổi trong việc cập nhật hình ảnh mới và cũ
                        $filePath = FILES_PATH.'/'.$thongtincu['loaiHang'].'/'.$thongtincu['maHang'];
                        if (!file_exists($filePath) && !is_dir($filePath))
                            mkdir($filePath);
                        $form = new EditForm();
                        $result1 = $form->uploadFiles($files,$filePath);
                        $result2 = $form->deleteFiles($exImages,$filePath);
                        // Cần kiểm tra ngoại lệ
                        if($result1 && $result2){
                            $thongbao = "Upload dữ liệu thành công";
                            $this->session->offsetSet('thongbao',$thongbao);
                            $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                        }else{
                            $thongbao = "Xảy ra sự cố khi thực hiện thay đổi hình ảnh";
                            $this->session->offsetSet('thongbao',$thongbao);
                            $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                        }
                    }

                    $thongbao = "Cập nhật dữ liệu thành công";
                    $this->session->offsetSet('thongbao',$thongbao);
                    $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                }else{
                    $thongbao = "Có lỗi trong quá trình cập nhật trên cơ sở dữ liệu";
                    $this->session->offsetSet('thongbao',$thongbao);
                    $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                }
            }else{
                // có lỗi về dữ liệu đầu vào,Không có sự thay đổi nào???
                $thongbao = "Không có sự thay đổi về dữ liệu";
                $this->session->offsetSet('thongbao',$thongbao);
                $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
            }
        }else{
            // chưa gửi yêu cầu thay đổi, lấy thông tin từ csdl và đưa vào session.
            $data = $productTable->getProduct($id);
            $this->view->thongtinsanpham =  $data;
            $data = (array)$data;
            $this->session->offsetSet('thongtinsanpham',$data);      
        }
        return $this->view;
    }

    public function deleteAction(){

        $this->view->action = 'delete';
        // kiểm tra biến post, nếu có tức đã gửi xác nhận xóa sản phẩm
        $post = $this->getRequest()->getPost()->toArray();
        if($post != NULL){
            // có biến post -> xóa file
            $productTable = $this->getServiceLocator()->get('Admin\Model\AdminProductTable');
            if(count($post)>1)
                echo 'delete action here';   
            else
                $result = $productTable->changeProduct(array('id'=>$post['id']),array('task'=>'delete'));
            if($result){
                $thongbao = "Xóa dữ liệu thành công";
                $this->session->offsetSet('thongbao',$thongbao);
            }else{
                $thongbao = "Xóa dữ liệu thất bại, vui lòng thử lại";
                $this->session->offsetSet('thongbao',$thongbao);
            }
            $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
        }else{
            // không có biến post -> yêu cầu xác nhận lại
            if($this->params()->fromRoute('id')!=NULL){
                // lấy id sản phẩm
                $id = $this->params()->fromRoute('id');
                $this->view->id = $id;
            }else{
                $this->session->error = 1;
                $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
            }
        }
        
        return $this->view;
    }

    public function compare($arr1 = array(), $arr2 = array()){
        // mặc định hình ảnh sẽ thay đổi do không có ảnh mới được up lên thì sẽ không có sự thay đổi
        // đầu vào là 2 mảng thông tin, đầu ra: false: nếu 2 mảng giống nhau, true: nếu 2 mảng khác nhau.
        $counter = count($arr1);
        $changes = 0;
        unset($arr1['id']);
        
        foreach ($arr1 as $key => $value) {
            if(isset($arr2[$key])){
                $temp1 = trim($value);
                $temp2 = trim($arr2[$key]);
                if($value != $arr2[$key]){
                    $changes++;
                }
            }
        }
        if($changes>0)
            return true;
        return false;
    }

    public function checkingRequest($type = null){
        // hàm xác nhận và gửi thông báo cho người dùng về các tác vụ được thực hiện.
        $this->view->action = 'confirm';
        
        $type = (int)$type;
        switch ($type) {
            case 0:
                // Upload dữ liệu thất bại"
                $thongbao = "Có lỗi trong việc upload dữ liệu, không thể thêm dữ liệu mới vào csdl, có thể mã sản phẩm bị trùng";
                $this->session->offsetSet('thongbao',$thongbao);
                $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                break;
            case 1:
                // upload dữ liệu thành công
                $thongbao = "Upload dữ liệu thành công";
                $this->session->offsetSet('thongbao',$thongbao);
                $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                break;
            case 2:
                // Có lỗi trong quá trình upload file và thư mục vì bị trùng
                $thongbao = "Thư mục đã tồn tại";
                $this->session->offsetSet('thongbao',$thongbao);
                $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                break;
            case 3:
                // upload file mới thất bại
                $thongbao = "Upload dữ liệu thất bại";
                $this->session->offsetSet('thongbao',$thongbao);
                $this->redirect()->toRoute(NULL,array('controller'=>'manage','action'=>'index'));
                break;                
            default:
                break;
        }

        return $this->view;
    }
}
